describe('SMT Complete Workflow E2E Tests', () => {
  before(() => {
    // 测试前清理数据
    cy.cleanTestData()
  })

  afterEach(() => {
    // 每个测试后清理
    cy.cleanTestData()
  })

  describe('正常业务流程测试', () => {
    it('应该完成完整的SMT工作流程', () => {
      cy.fixture('test-data').then((testData) => {
        const { orders, operators, parts } = testData
        
        // 1. 访问首页
        cy.visit('/')
        cy.waitForPageLoad()
        
        // 2. 进入菜单页面
        cy.get('.menu-item').first().click()
        cy.waitForPageLoad()
        
        // 3. 输入订单号 - Select页面
        cy.url().should('include', '/pages/select')
        cy.inputOrderNo(orders.valid.fullScanCode)
        
        // 4. 确认作业员 - Operator Confirm页面
        cy.url().should('include', '/pages/operator-confirm')
        cy.inputOperatorId(operators.valid.operatorId)
        cy.verifyOrderData({
          orderNo: orders.valid.orderNo,
          operatorName: operators.valid.operatorName
        })
        
        // 5. 物料配送确认 - Delivery Confirm页面
        cy.url().should('include', '/pages/delivery-confirm')
        cy.verifyOrderData({
          orderNo: orders.valid.orderNo,
          mounterId: orders.valid.machineId
        })
        
        // 扫描第一个物料
        cy.scanPartBatch(parts.valid[0].scanCode)
        cy.verifyStatus('OK')
        
        // 扫描第二个物料
        cy.scanPartBatch(parts.valid[1].scanCode)
        cy.verifyStatus('OK')
        
        // 6. 完成工作流程
        cy.completeWorkflow()
        
        // 7. 验证返回到SMT页面或完成页面
        cy.url().should('include', '/pages/smt')
      })
    })
  })

  describe('异常处理测试', () => {
    it('应该处理无效订单号', () => {
      cy.fixture('test-data').then((testData) => {
        cy.visit('/')
        cy.waitForPageLoad()
        
        cy.get('.menu-item').first().click()
        cy.waitForPageLoad()
        
        // 输入无效订单号
        cy.inputOrderNo(testData.orders.invalid.fullScanCode)
        
        // 应该显示错误信息或保持在当前页面
        cy.url().should('include', '/pages/select')
        // 可能会有错误提示
        cy.get('body').should('exist')
      })
    })

    it('应该处理无效作业员ID', () => {
      cy.fixture('test-data').then((testData) => {
        cy.visit('/')
        cy.waitForPageLoad()
        
        cy.get('.menu-item').first().click()
        cy.waitForPageLoad()
        
        // 先输入有效订单号
        cy.inputOrderNo(testData.orders.valid.fullScanCode)
        
        // 然后输入无效作业员ID
        cy.inputOperatorId(testData.operators.invalid.operatorId)
        
        // 应该显示错误或保持在当前页面
        cy.url().should('include', '/pages/operator-confirm')
      })
    })

    it('应该处理重复扫描物料', () => {
      cy.fixture('test-data').then((testData) => {
        const { orders, operators, parts } = testData
        
        cy.visit('/')
        cy.waitForPageLoad()
        
        cy.get('.menu-item').first().click()
        cy.waitForPageLoad()
        
        cy.inputOrderNo(orders.valid.fullScanCode)
        cy.inputOperatorId(operators.valid.operatorId)
        
        // 进入物料配送确认页面
        cy.url().should('include', '/pages/delivery-confirm')
        
        // 第一次扫描
        cy.scanPartBatch(parts.valid[0].scanCode)
        cy.verifyStatus('OK')
        
        // 重复扫描同一物料
        cy.scanPartBatch(parts.valid[0].scanCode)
        
        // 应该显示重复警告或错误状态
        cy.get('body').should('exist') // 确保页面仍然响应
      })
    })

    it('应该处理无效物料扫描', () => {
      cy.fixture('test-data').then((testData) => {
        const { orders, operators, parts } = testData
        
        cy.visit('/')
        cy.waitForPageLoad()
        
        cy.get('.menu-item').first().click()
        cy.waitForPageLoad()
        
        cy.inputOrderNo(orders.valid.fullScanCode)
        cy.inputOperatorId(operators.valid.operatorId)
        
        // 进入物料配送确认页面
        cy.url().should('include', '/pages/delivery-confirm')
        
        // 扫描无效物料
        cy.scanPartBatch(parts.invalid[0].scanCode)
        
        // 应该显示NG状态或错误信息
        cy.get('.status-indicator').should('exist')
      })
    })
  })

  describe('后端API集成测试', () => {
    it('应该验证订单数据API', () => {
      cy.fixture('test-data').then((testData) => {
        // 测试订单查询API
        cy.apiRequest('GET', `/api/orders/${testData.orders.valid.orderNo}`)
          .then((response) => {
            if (response.status === 200) {
              expect(response.body).to.have.property('orderNo')
            } else {
              // API可能返回404或其他状态，这也是有效的测试结果
              cy.log(`API returned status: ${response.status}`)
            }
          })
      })
    })

    it('应该验证作业员信息API', () => {
      cy.fixture('test-data').then((testData) => {
        // 测试作业员查询API
        cy.apiRequest('GET', `/api/workers/${testData.operators.valid.operatorId}`)
          .then((response) => {
            if (response.status === 200) {
              expect(response.body).to.have.property('operatorId')
            } else {
              cy.log(`Worker API returned status: ${response.status}`)
            }
          })
      })
    })

    it('应该验证物料扫描记录API', () => {
      cy.fixture('test-data').then((testData) => {
        const scanRecord = {
          orderNo: testData.orders.valid.orderNo,
          partId: testData.parts.valid[0].partId,
          lotNo: testData.parts.valid[0].lotNo,
          operatorId: testData.operators.valid.operatorId
        }
        
        // 测试扫描记录提交API
        cy.apiRequest('POST', '/api/scan-records', scanRecord)
          .then((response) => {
            // 验证API响应
            cy.log(`Scan record API returned status: ${response.status}`)
            if (response.status === 200 || response.status === 201) {
              expect(response.body).to.have.property('success')
            }
          })
      })
    })
  })

  describe('网络异常处理测试', () => {
    it('应该处理后端服务不可用情况', () => {
      // 模拟网络请求失败
      cy.intercept('GET', '**/api/**', { forceNetworkError: true }).as('networkError')
      
      cy.visit('/')
      cy.waitForPageLoad()
      
      cy.get('.menu-item').first().click()
      cy.waitForPageLoad()
      
      // 尝试输入订单号，应该能处理网络错误
      cy.get('input[placeholder*="订单"]').type('TEST123')
      cy.get('.btn-start').click()
      
      // 验证错误处理
      cy.get('body').should('exist')
    })
  })
})